<?php

use Illuminate\Http\Request;
use App\Dog;

/*
   |--------------------------------------------------------------------------
   | Application Routes
   |--------------------------------------------------------------------------
   |
   | Here is where you can register all of the routes for an application.
   | It's a breeze. Simply tell Laravel the URIs it should respond to
   | and give it the controller to call when that URI is requested.
   |
 */

Route::get('/', function () {
    return view('bienvenida');
});

Route::get('/login', function () {
    return view('login');
});

Route::get('/register', function () {
    return view('register');
});

Route::post('/register', function (Request $request) {
    $id = DB::select( DB::raw('select max(id_usuario) as id from usuario;') );
    $id = $id[0]->id + 1;
    $results = DB::insert(DB::raw("insert into usuario(id_usuario, pass, nombre, email, tipo, fecha_registro, datos_adicionales) values(:id, :pass, :nombre, :email, :tipo, :fecha, :otros)"),
                          array('pass' => $request->password,
                                'nombre' => $request->username,
                                'email' => $request->email,
                                'tipo' => 1,
                                'fecha' => date("Y-m-d", time()),
                                'otros' => $request->additional_data,
                                'id' => $id));
    $new_data = DB::select( DB::raw('select * from usuario;') );
    
    return json_encode($new_data);
});

Route::post('/register_list', function (Request $request)
{
    $results = DB::select('select * FROM usuario');
    return json_encode($results);
}
);

Route::post('/register_del', function(Request $request)
{
    $nombre= $request->username;
    $results = DB::delete('DELETE FROM usuario WHERE nombre = ? ;', [$nombre]);
    
    if ($results == 0)
    {
        echo 'Error no se ha borrado nada';
        return -1;
    }
    else
    {
        echo 'Usuario '.$nombre.' eliminado ! <br></br>';
        $results = DB::select( DB::raw('select * from usuario;') );
        return json_encode($results);
    }
}
);

Route::post('/mod_usuario', function (Request $request)
{
    $nombre = $request->username;
    $rol = $request->rol;

    $res = DB::update('update usuario SET tipo = ? WHERE nombre = ? ;', [$rol, $nombre]);
    
    if ($res == 0)
    {
        echo 'Error No se ha modificado ningun usuario <br>';
        return -1;
    }
    else
    {
        $results = DB::select( DB::raw('select * from usuario WHERE nombre = ? ;'), [$nombre] );
        return json_encode($results);
    }
});

Route::get('ruta', function () {
    return view('lol');
});

Route::get('nuevo-perrito', function () {
    return view('nuevo-perrito');
});

Route::get('nueva-vista', function () {
    return view('nueva');
});

Route::get('guardar-chato', function () {
    $dog = new Dog;
    $dog->name = 'Chato';
    $dog->save();
});

Route::post('nuevo', function (Request $request) {
    $dog = new Dog;
    $dog->name = $request->name;
    $dog->save();
});

Route::get('login', function () {
    return view('login');
});

Route::get('map', function () {
    return view('map');
});

Route::get('area', function () {
    return view('area');
});
Route::post('area', function (Request $request) {
    $results = DB::insert( DB::raw('insert into area(id_area) values(:id);'), array('id' => $request->id_area) );
    $newData = DB::select( DB::raw('select * from area') );
    return json_encode($newData);
});
Route::get('borrar-area', function () {
    return view('borrar-area');
});
Route::post('borrar-area', function (Request $request) {
    $results = DB::insert( DB::raw('delete from area where id_area = :id;'), array('id' => $request->id) );
    $newData = DB::select( DB::raw('select * from area') );
    return json_encode($newData);
});
Route::get('modificar-area', function () {
    return view('modificar-area');
});
Route::post('modificar-area', function (Request $request) {
    $results = DB::raw( DB::raw('update area set id_area = :id_new where id_area = :id;'),
                        array('id' => $request->id,
                              'id_new' => $request->new_id) );

    $newData = DB::select( DB::raw('select * from area') );
    return json_encode($newData) . $request->nombre;
});

Route::get('modificar-departamento', function () {
    return view('modificar-departamento');
});
Route::post('modificar-departamento', function (Request $request) {
    $results = DB::update( DB::raw('update departamento set nombre = :nombre where id_departamento = :id;'),
                        array('id' => $request->id,
                              'nombre' => $request->nombre) );

    $newData = DB::select( DB::raw('select * from departamento') );
    return json_encode($newData) . $request->id;
});
Route::get('borrar-departamento', function () {
    return view('borrar-departamento');
});
Route::post('borrar-departamento', function (Request $request) {
    $results = DB::delete( DB::raw('delete from departamento where id_departamento = :id;'),
                        array('id' => $request->id));

    $newData = DB::select( DB::raw('select * from departamento') );
    return json_encode($newData) . $request->id;
});


Route::get('parada', function () {
    return view('parada');
});
Route::post('nueva_parada', function (Request $request) {
    $results = DB::insert( DB::raw("insert into parada(nombre, latitud, longitud) values(:nombre, :latitud, :longitud );"),
                           array('nombre' => $request->nombre,
                                 'latitud' => $request->latitud,
                                 'longitud' => $request->longitud, ) );
    $newData = DB::select( DB::raw('select * from parada where nombre = :nombre;'), array('nombre' => $request->nombre ));

    return json_encode($newData);
});
Route::get('borrar-parada', function () {
    return view('borrar-parada');
});
Route::post('borrar-parada', function (Request $request) {
    $results = DB::delete( DB::raw("delete from parada where id_parada = :id;"),
                           array('id' => $request->id_parada) );
    $newData = DB::select( DB::raw('select * from parada;') );
    return json_encode($newData);
});
Route::get('modificar-parada', function () {
    return view('modificar-parada');
});
Route::post('modificar-parada', function (Request $request) {
    $results = DB::update( DB::raw("update parada set nombre = :nombre, latitud = :latitud, longitud = :longitud where id_parada = :id;"),
                           array('id' => $request->id_parada,
                                 'nombre' => $request->nombre,
                                 'latitud' => $request->latitud,
                                 'longitud' => $request->longitud));
    $newData = DB::select( DB::raw('select * from parada;') );
    return json_encode($newData);
});


Route::get('horario', function () {
    return view('horario');
});
Route::post('horario', function (Request $request) {
    $horario = $request->horario;
    $results = DB::insert('INSERT INTO horario (descrip) VALUES ( ? )', [$horario]);
             
    $newData = DB::select( DB::raw('select * from horario WHERE descrip = ? ;'), [$horario] );
    //    return var_dump($newData);
    return json_encode($newData);
});

Route::get('listar_horario', function()
{
    $results = DB::select('select * from horario ;');
    return json_encode($results);
});

Route::post('borrar_horario', function(Request $request)
{
    $id_horario = $request->idh;
    $results = DB::delete('DELETE FROM horario WHERE id_horario = ? ;',[$id_horario]);
    if($results == 0)
    {
        echo "Error no se ha eliminado ningun horario <br></br>";
        return -1;
    }        
    else
    {
        echo 'Horario '.$id_horario.' eliminado! </br> </br>';
        return json_encode(DB::select('SELECT * FROM horario;'));
    }
     
});

Route::get('departamento', function () {
    return view('departamento');
});

Route::get('about', function () {
    return view('about');
});

// TODO: Esta funcion debe ser editable?
// Route::post('departamento', function (Request $request) {
//     $results = DB::insert( DB::raw("insert into departamento(id_departamento, nombre) values(:id, :nombre);"),
//                            array('id' => $request->id,
//                                  'nombre' => $request->nombre ) );
//     $newData = DB::select( DB::raw('select * from departamento;') );
//     return var_dump($newData);
// });

// #################### BACKEND TEST ###########################
// #############################################################
Route::get('backend_test', function()
{
    return view('funciones_backend');
});

Route::post('comprobar_login', function(Request $request)
{
    $nombre = $request->nombre;
    $pass = $request->pass;
    
    $results = DB::select('SELECT nombre FROM usuario WHERE nombre = ? AND pass = ?',[$nombre, $pass]);
    //    $results = DB::table('usuario')->where('nombre', '=', $nombre)->get();
    if(json_encode($results) == '[]') // null?
        return -1;
    else
        return 0;
    //    echo $results->nombre; no funciona
}
);

Route::post('listar_localidades_en_area_cuadrada', function(Request $request)
{
    // Ver FuncionesDB.sql la funcion 'f_localidad_dentro_de_area'
    $x1 = $request->x1;
    $x2 = $request->x2;
    $y1 = $request->y1;
    $y2 = $request->y2;

    if(is_null($x1)||is_null($x2)||is_null($y1)||is_null($y2))
    {
        echo 'ERROR: Algun/os campo/s obligatorio/s esta/n vacio/s </br>';
        return -1;
    }
    else
    {
        $res_localidades = DB::select('SELECT * FROM f_localidad_dentro_de_area( ? , ? , ? , ?);', [$x1, $y1, $x2, $y2]);
        if(json_encode($res_localidades)=='[]') // null
            return -1;
        else
            return json_encode($res_localidades);
    }
}
);

Route::get('l_localidades_id_nombre', function()
    {
        $res = DB::select('select id_localidad, nombre FROM localidad');
        
        return json_encode($res);
    }
);

Route::post('listar_lugares_en_area_cuadrada', function(Request $request)
{
    // Ver FuncionesDB.sql la funcion 'f_lugar_dentro_de_area'
    $x1 = $request->x1;
    $x2 = $request->x2;
    $y1 = $request->y1;
    $y2 = $request->y2;

    if(is_null($x1)||is_null($x2)||is_null($y1)||is_null($y2)) //FIXME: no se detecta los campos vacios?
    {
        echo 'ERROR: Algun/os campo/s obligatorio/s esta/n vacio/s </br>';
        return -1;
    }
    else
    {
        $res_lugares = DB::select('SELECT * FROM f_lugar_dentro_de_area( ? , ? , ? , ?);', [$x1, $y1, $x2, $y2]);
        if(json_encode($res_lugares)=='[]') // null
            return -1;
        else
            return json_encode($res_lugares);
    }
}
);

Route::post('listar_medios_de_transporte_en_area_cuadrada', function(Request $request)
{
    // Ver FuncionesDB.sql la funcion 'f_localidad_pertence_a_area'
    $x1 = $request->x1;
    $x2 = $request->x2;
    $y1 = $request->y1;
    $y2 = $request->y2;

    if(is_null($x1)||is_null($x2)||is_null($y1)||is_null($y2)) //FIXME: no se detecta los campos vacios?
    {
        echo 'ERROR: Algun/os campo/s obligatorio/s esta/n vacio/s </br>';
        return -1;
    }
    else
    {
        // ver funcion f_medio_transporte_dentro_de_area en FuncionesDB.sql

        $res_mt = DB::select('SELECT * FROM f_medio_transporte_dentro_de_area(?, ?, ?, ?) GROUP BY "id_medioT", id_lugar, tipo, descr;', 
                             [$x1, $y1, $x2, $y2]);
        if(json_encode($res_mt)=='[]') //null
            return -1;
        else
            return json_encode($res_mt);
    }
}
);

// listar paradas dentro de area cuadrada
Route::post('listar_paradas_dentro_de_area_cuadrada', function(Request $request)
{
    // Ver FuncionesDB.sql la funcion 'f_localidad_pertence_a_area'
    $x1 = $request->x1;
    $x2 = $request->x2;
    $y1 = $request->y1;
    $y2 = $request->y2;

    if(is_null($x1)||is_null($x2)||is_null($y1)||is_null($y2)) //FIXME: no se detecta los campos vacios?
    {
        echo 'ERROR: Algun/os campo/s obligatorio/s esta/n vacio/s </br>';
        return -1;
    }
    else
    {
        // ver funcion  f_parada_dentro_de_area en FuncionesDB.sql
        $res_mt = DB::select('SELECT * FROM  f_parada_dentro_de_area(?, ?, ?, ?) ;', 
                             [$x1, $y1, $x2, $y2]);
        if(json_encode($res_mt)=='[]') //null
            return -1;
        else
            return json_encode($res_mt);
    }
}
);

// listar actividades dentro de area cuadrada
Route::post('listar_actividades_dentro_de_area_cuadrada', function(Request $request)
{
    // Ver FuncionesDB.sql la funcion 'f_localidad_pertence_a_area'
    $x1 = $request->x1;
    $x2 = $request->x2;
    $y1 = $request->y1;
    $y2 = $request->y2;

    if(is_null($x1)||is_null($x2)||is_null($y1)||is_null($y2)) //FIXME: no se detecta los campos vacios?
    {
        echo 'ERROR: Algun/os campo/s obligatorio/s esta/n vacio/s </br>';
        return -1;
    }
    else
    {
        // ver funcion  f_actividad_dentro_de_area en FuncionesDB.sql
        $res_mt = DB::select('SELECT * FROM  f_actividad_dentro_de_area(?, ?, ?, ?) ;', 
                             [$x1, $y1, $x2, $y2]);
        if(json_encode($res_mt)=='[]') //null
            return -1;
        else
            return json_encode($res_mt);
    }
}
);


// listar departamentos
Route::get('listar_deps' , function()
{
    $res = DB::select('select * from departamento');
    return json_encode($res);
	//    return 'Get';
});
// listar localidades por departamentos
Route::post('listar_localidadades_por_nom_dep', function(Request $request)
{
    $nombre_dep = $request->nombre_dep;
    $results = DB::select('SELECT l.id_localidad, l.nombre, l.num_habitantes, l.id_dep, l.fec_fundacion, l.descr, l.latitud, l.longitud, l.id_area
 FROM localidad l, departamento d 
WHERE l.id_dep=d.id_departamento AND d.nombre= :nom', ['nom'=>$nombre_dep]);

    return json_encode($results);
});

// listar localidad que coincida con el nombre
Route::post('l_localidades_nombre', function(Request $request)
{
    $nombre = $request->nombre;
    $results = DB::select('SELECT * FROM localidad WHERE localidad.nombre= :nombre', ['nombre'=>$nombre]);
    return json_encode($results);
});

// lista los medios de transporte que van al nombre de la localidad dada (nombre)
Route::post('l_transporte_localidad', function(Request $request)
{
    $nombre = $request->nombre;
    // se usa la vista 'v_tipo_transporte_lugar' (ver vistas.sql)
    $results = DB::select("select * from v_tipo_transporte_lugar WHERE localidad= :l", ['l'=>$nombre]);

    return json_encode($results);
});

// lista los lugares pertenecientes a una localidad dada (nombre)
Route::post('l_lugares_localidad', function(Request $request)
{
    $nombre = $request->nombre;

    $results = DB::select("select lu.nombre as lugar, lu.descr, lu.latitud, lu.longitud, lu.espatrimonio, l.nombre as localidad
 FROM localidad l, lugar lu
 WHERE lu.id_lugar=l.id_localidad AND l.nombre = :l ", ['l'=>$nombre]);

    return json_encode($results);
});

// lista las actividades que se llevan a cabo en una localidad dada (nombre)
Route::post('l_actividades_localidad', function(Request $request)
{
    $nombre = $request->nombre;

    $results = DB::select("select l.nombre as localidad, a.nombre, a.descripcion, a.fecha_inicio, a.fecha_fin            
FROM actividad a, localidad l
WHERE a.id_localidad=l.id_localidad AND l.nombre= :l ", ['l'=>$nombre]);

    return json_encode($results);
});

// lista los servicios basicos en la localidad  dada (nombre)
Route::post('l_servicios_basicos_localidad', function(Request $request)
{
    $nombre = $request->nombre;

    $results = DB::select("select l.nombre as localidad, lu.nombre as lugar, sb.nombre as Servicio_basico, sb.calidad, h.descrip as horario
FROM localidad l, lugar lu, servicio_basico sb, horario h
WHERE sb.id_lugar=lu.id_lugar AND sb.id_horario=h.id_horario AND lu.id_localidad=l.id_localidad AND l.nombre= :l ", ['l'=>$nombre]);

    return json_encode($results);
});

Route:post('l_lugares_coordenada', function(Request $request)
{
    $latitud = $request->latitud;
    $longitud = $request->longitud;
    
    $results = DB::select("SELECT * FROM lugar WHERE latitud = :lat AND longitud = :lon" ,['lat'=>$latitud, 'lon'=>$longitud]);

    //    return json_encode($request); Interesante!
    return json_encode($results);
}
);

// TODO:listar actividades dada una coordenada
// TODO:listar medios de transporte dada una coordenada
// TODO:listar servicios basicos dada una coordenada
// TODO:listar itinerarios dado una localidad
// TODO:listar itinerarios dado un lugar


Route::get('l_localidades_id_nombre', function()
{
    $res = DB::select('select id_localidad, nombre FROM localidad');
    
    return json_encode($res);
}
);

Route::get('l1', function ()
{	
    $results = DB::select('select * from departamento where id_departamento = :id', ['id' => 1]);
    
    return json_encode($results);
});

// ################ CONSUMO DE DATOS ############ ############

/*
  El cliente ha enviado datos al servidor mediante un formulario de tipo post. El servidor le da tratamiento a los datos enviados para ingresarlos a la base de datos de forma pertinente.
  Esta operación sólo se realiza cuando el usuario está editando el mapa, al añadir o editar una localidad, pueblo o lugar. Por lo que este “consumo de datos” es necesario para los nodos hoja del nodo “Editar mapa”.
*/

Route::post('nuevo_usuario', function(Request $request)
{
    $nombre = $request->nombre;
    $pass = $request->pass;
    $email = $request->email;
    $tipo = $request->tipo;
    $datos_adicionales = $request->datos_adicionales;

    if (is_null($nombre) || is_null($pass) || is_null($tipo))
    {
        echo 'ERROR: Algun/os campo/s obligatorio/s esta/n vacio/s </br>';
        return -1;
    }
    
    // Ver FuncionesDB.sql la funcion 'f_insertar_usuario'
    $results = DB::select('select f_insertar_usuario(? , ? , ? , ? , ?)', [$nombre, $pass, $email, $tipo, $datos_adicionales]);
    
    if(json_encode($results) == '[{"f_insertar_usuario":-1}]')
        return -1;
    else
        return 0;
    //return $results; // [{"f_insertar_usuario":-1}] si da error, [{"f_insertar_usuario":0}] si esta OK
}
);

Route::post('ajax-test', function () {
    return 'yay!';
});

Route::post('nueva_localidad', function (Request $request)
{
    $nombre = $request->nombre;
    $num_habitantes = $request->num_habitantes;
    $id_dep = $request->id_dep;
    $fec_fundacion = $request->fec_fundacion;
    $descr = $request->descr;
    $latitud = $request->latitud;
    $longitud = $request->longitud;

    //    $id_area = $request->id_area;
    // if (is_null($id_area))
    //     $id_area = '124';
    
    DB::insert('insert into localidad (nombre, num_habitantes, id_dep, fec_fundacion, descr, latitud, longitud)
VALUES (?, ?, ?, ?, ?, ?, ? )', [$nombre, $num_habitantes, $id_dep, $fec_fundacion, $descr, $latitud, $longitud ]);

    $results = DB::select("select * from localidad l WHERE l.nombre = ? AND l.latitud = ? AND l.longitud = ? ", [$nombre, $latitud, $longitud]);
    return json_encode($results);
});

Route::post('nuevo_lugar', function (Request $request)
{
    $nombre = $request->nombre;
    $descr = $request->descr;
    $id_localidad = $request->id_localidad;
    $id_departamento = $request->id_departamento;
    //    $espatrimonio = $request->espatrimonio; // FIXME: Check Box?
    $latitud = $request->latitud;
    $longitud = $request->longitud;
    $id_area = $request->id_area;

    if(is_null($nombre) || is_null($descr) || is_null($id_localidad) ||is_null($id_departamento) || is_null($latitud) || is_null($longitud))   // FIXME: no se detectan campos vacios ?
    {
        echo "Uno o mas campos obligatorios estan vacio";
        return -1;
    }
    // comprobar que exista el id de la localidad
    $res = DB::select('SELECT * FROM localidad l WHERE l.id_localidad = ?', [(int)($id_localidad)]);
    if (json_encode($res) == '[]')
    {
        echo 'Error no existe tal localidad<br>'.json_encode($res);
        return -1;
    }
    // comprobar que exista la localidad
    $res = DB::select('SELECT * FROM departamento WHERE id_departamento = ? ', [(int)($id_departamento)]);
    if (json_encode($res) == '[]')
    {
        echo 'Error no existe tal departamento <br>'.json_encode($id_departamento).'<br>';
        return -1;
    }

    $results = DB::insert('insert into lugar(nombre, descr, id_localidad, id_departamento, espatrimonio, latitud, longitud, 
id_area) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [$nombre, $descr, (int)($id_localidad) , (int)($id_departamento),
                                            'false', $latitud, $longitud, (int)($id_area)]);

    return json_encode($results);
});



//TODO agregar metodo para insertar valores en esta tabla
Route::post('insertar_dep' , function(Request $request)
{
    // $id_departamento = $request->id_departamento;
    // $nombre = $request->nombre;
    $id_departamento = $request->id_departamento;
    $nombre = $request->nombre;

    return $nombre;
    //	return 'Post';
});

// llenado de departamentos por defecto (no hay mas de 9 deps)
Route::post('default_dep', function()
{
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [1, 'COCHABAMBA']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [2, 'LA PAZ']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [3, 'SANTA CRUZ']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [4, 'ORURO']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [5, 'POTOSI']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [6, 'CHUQUISACA']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [7, 'TARIJA']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [8, 'BENI']);
    DB::insert('INSERT INTO departamento (id_departamento, nombre) values (?, ?)', [9, 'PANDO']);
});


Route::post('modify_localidad', function (Request $request) {
    
});

